package main

import "fmt"

// 运算符

func main() {
	// 算数运算符
	var (
		a = 4
		b = 9
	)
	fmt.Println(a + b)
	fmt.Println(a - b)
	fmt.Println(a * b)
	fmt.Println(a / b)
	fmt.Println(a % b)
	a++ // 自增，单独的语句，不能放在=右边赋值 ===> a = a + 1 go语言中没有 ++a
	b-- // 自减，单独的语句，不能放在=右边赋值 ===> b = b - 1 go语言中没有 --b
	fmt.Println(a)
	fmt.Println(b)

	// 关系运算符 （比较运算符） 返回是布尔值
	fmt.Println(a == b) // Go是强类型语言，同类型才能比较
	fmt.Println(a != b)
	fmt.Println(a >= b)
	fmt.Println(a > b)
	fmt.Println(a < b)
	fmt.Println(a <= b)

	// 逻辑运算符  返回是布尔值
	age := 22
	// &&：与（and）
	if age > 18 && age < 60 {
		fmt.Println("需要上班的")
		// ||：或（or）
	} else if age < 18 || age > 60 {
		fmt.Println("不需要上班的")
	}
	// !:非（not）-->取反
	isMarried := false
	fmt.Println(isMarried)
	fmt.Println(!isMarried)

	// 位运算符  二进制位运算
	// 5的二进制 101
	// 2的二进制 10
	// 按二进制位比较
	// & 按位与（两位均为1才为1）
	fmt.Println(5 & 2) // 000 = 0
	// | 按位或（两位有一位为1就为1）
	fmt.Println(5 | 2) // 111 = 7
	// ^ 按位异或（两位不一样就为1）
	fmt.Println(5 | 2) // 111 = 7
	// << 将二进制左移指定位数
	fmt.Println(5 << 1) // 101往左移动1位 ===> 1010 =7
	// >> 将二进制右移指定位数
	fmt.Println(5 >> 1) // 101往左移动1位 ===> 10 =2

	// PS：
	var i = int8(1)      //只能存8位
	fmt.Println(i << 10) // 1左移10位 = 10000000000 ，只能展示8位 000000000 =0

	// 赋值运行符
	var x int
	x = 1
	x += 1 // x = x + 1  一般写成 x++
	x -= 1
	x *= 1
	x /= 1
	x %= 1
	x <<= 1
	x >>= 1
	x &= 1
	x |= 1
	x ^= 1
}
